// 居然有点没印象了, 貌似是, 任务都用一个时间完成, 然后需要在时间点之前完成, 就可以获取积分;
// 所以我的想法是, 先按照积分进行排序, 反正都要干, 先干最大积分的, 但是最大积分有时间限制,
// 为了最大化积分, 所以, 在固定工时 & 积分对应的限制时间之间, 我们取个最小值?
// 为啥是最小值, 如果任务完成的时间是最小值, 那么任务被完成了,
// 如果工时是最小值, 那么任务也被完成了,  相应消耗一个工时,
// 是否可以考虑? 左右依次来? 现在是怎么实现?
// 首先, 对任务进行排序, 积分优先, 然后工时搞一个数组, 用于记录工时是否被使用
// 然后遍历积分表, 被用掉的, 不能重复使用, 现在来实现下代码
const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let n, time;
let initArr = [];
rl.on("line", (line)=>{
    if(n === undefined) {
        n = Number(line.trim())
    } else if (time === undefined) {
        time = Number(line.trim())
    } else {
        initArr.push(line.trim().split(" ").map(Number));
        if(initArr.length === n) {
            console.log(getResult(n, time, initArr))

            // clear
            n = time = undefined
            initArr.length = 0
        }

    }
})

function getResult(n, time, initArr) {
    // sort 升序
    initArr.sort((a, b) => {
        return b[1] - a[1]
    })

    let used = new Array(time + 1).fill(false)
    used[0] = true
    let ans = 0
    //遍历
    for (const arr of initArr) {
        const [before, point] = arr;
        for (let i = Math.min(time, before); i > 0 ; i--) {
            if(!used[i]) {
                used[i] = true;
                ans+=point;
                break;
            }
        }
    }
    return ans
}